{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基础概念\n",
    "***\n",
    "***\n",
    "Time: 2020-09-05 <br>\n",
    "Author: dsy\n",
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 偏差与方差"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "方差：\n",
    "期望值与真实值之间的波动程度，衡量的是**稳定性**\n",
    "\n",
    "其计算公式：\n",
    "$$\n",
    "E \\Big( \\big(E(\\tilde{f})) - \\tilde{f} \\big)^2 \\Big)\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.25"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用numpy进行计算\n",
    "import numpy as np\n",
    "data = np.array([1,2,3,4])\n",
    "data.var()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.25"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用公式进行计算\n",
    "((data - data.mean()) ** 2).sum() /4."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "偏差：\n",
    "期望值与真实值之间的一致差距，衡量的是**准确性**\n",
    "其中之一的计算公式：\n",
    "$$\n",
    " \\big(f - E(\\tilde{f}) \\big)^ 2\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.1 模型训练为什么要引入偏差和方差？请理论论证"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "优化监督学习=优化模型的泛化误差，模型的泛化误差可分解为偏差、方差与噪声之和`Err = bias + var + irreducible error`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以回归任务为例,其实更准确的公式为：$Err = bias^2 + var + irreducible\\ error^2$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "符号的定义：一个真实的任务可以理解为$Y=f(x)+e$，其中$f(x)$为规律部分，$e$为噪声部分"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练数据D训练的模型称之为$\\tilde{f(x)}$，当我们使用相同的算法，但使用不同的训练数据D时就会得到多个$\\tilde{f(x)}$。则$E\\Big(\\tilde{f(x)} \\Big)$代表了这个模型的期望，即使用某一算法训练模型所能得到的稳定的平均水平。\n",
    "* 方差：模型的稳定性：$var= E \\Big( \\big(E(\\tilde{f})) - \\tilde{f} \\big)^2 \\Big)$\n",
    "* 偏差：模型的准确性：$bias^2= \\big(f - E(\\tilde{f}) \\big)^ 2$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\n",
    "Err  = Err(f,\\tilde{f}) + Err(f,Y) \\\\\n",
    "Err(f,\\tilde{f})为可解释规则误差； Err(f,Y)为噪声e部分，即为:\\sigma_e\\\\\n",
    "$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "也可以看下面的推导：\n",
    "$$\n",
    "\\begin{aligned}\n",
    "E(f,\\tilde{f}) &= E\\big((f-\\tilde{f})^2 \\big)\\\\\n",
    "& = E\\Big( \\big(f-E(\\tilde{f}) + E(\\tilde{f}) -\\tilde{f} \\big)^2 \\Big) \\\\\n",
    "& = E\\Big( \\big(f-E(\\tilde{f}) \\big)^2 +  \\big(E(\\tilde{f}) -\\tilde{f} \\big)^2 + 2 \\big(f-E(\\tilde{f})\\big)\\big( E(\\tilde{f}) -\\tilde{f} \\big)\\Big) \\\\\n",
    "& = bias^2 + var + \\sigma_e\n",
    "\\end{aligned}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.2 高方差"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1.2.1 什么情况下引发高方差？\n",
    "* 过高复杂度的模型，对训练集进行过拟合\n",
    "    * 带来的后果就是在训练集合上效果非常好，但是在校验集合上效果极差\n",
    "    * 更加形象的理解就是用一条高次方程去拟合线性数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1.2.2 如何解决高方差问题？\n",
    "* 在模型复杂程度不变的情况下，增加更多数据\n",
    "* 在数据量不变的情况下，减少特征维度\n",
    "* 在数据和模型都不变的情况下，加入正则化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1.2.3 以上方法是否一定有效？\n",
    "* 增加数据如果和原数据分布一致，无论增加多少必定解决不了高方差\n",
    "    * smote对样本进行扩充是否必定可以避免高方差？\n",
    "    * 过采样是否解决高方差问题？\n",
    "* 减少的特征维度如果是共线性的维度，对原模型没有任何影响\n",
    "    * 罗辑回归中，如果把一列特征重复2遍，会对最后的结果产生影响么？\n",
    "* 正则化通常都是有效的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.3 高偏差"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1.3.1 如何解决高偏差问题？\n",
    "- 尝试获得更多的特征\n",
    "    - 从数据入手，进行特征交叉，或者特征的embedding化\n",
    "- 尝试增加多项式特征\n",
    "    - 从模型入手，增加更多线性及非线性变化，提高模型的复杂度\n",
    "- 尝试减少正则化程度λ"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1.3.2 以上方法是否一定有效？\n",
    "- 特征越稀疏，高方差的风险越高\n",
    "- 多个线性变换=一个线性变换，多个非线性变换不一定=一个多线性变换\n",
    "- 正则化通常都是有效的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1.3.3 遇到过的机器学习中的偏差与方差问题？\n",
    "- 从偏差-方差分解的角度看，Bagging主要关注降低方差，因此它在不剪枝决策树，神经网络等易受样本扰动的学习器上效果更为明显。\n",
    "- 从偏差-方差分解的角度看，Boosting主要关注降低偏差，因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1.3.4 就理论角度论证Bagging、Boosting的方差偏差问题"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Bagging` 即套袋法，其算法过程如下：\n",
    "\n",
    "* 从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本（在训练集中，有些样本可能被多次抽取到，而有些样本可能一次都没有被抽中）。共进行k轮抽取，得到k个训练集。（k个训练集之间是相互独立的）\n",
    "\n",
    "* 每次使用一个训练集得到一个模型，k个训练集共得到k个模型。（注：这里并没有具体的分类算法或回归方法，我们可以根据具体问题采用不同的分类或回归方法，如决策树、感知器等）\n",
    "\n",
    "* 对分类问题：将上步得到的k个模型采用投票的方式得到分类结果；对回归问题，计算上述模型的均值作为最后的结果。（所有模型的重要性相同）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Bagging`的推导：\n",
    "\n",
    "一般来说`Bagging`的不能显著降低偏差，因此需要考虑方差，具体的可以参考知乎:[为什么说bagging是减少variance，而boosting是减少bias?\n",
    "](https://www.zhihu.com/question/26760839)。\n",
    "\n",
    "假设`bagging`和`boosting`有n个模型，模型的权重为$\\gamma$,相关系数为$\\rho $,方差为$\\delta^2$\n",
    "\n",
    "$Var(x,y) = Var(x)+ Var(y) + 2cov(x,y),\\text{注意 x + y 为整个样本数}$\n",
    "\n",
    "在`Bagging`中\n",
    "$$\n",
    "\\begin{aligned}\n",
    "Var(F) & = Var(x)+ Var(y) + 2cov(x,y) \\\\\n",
    "& = \\sum Var(\\gamma_i f_i) + 2 \\sum \\sum cov(\\gamma_i f_i,\\gamma_j f_j) \\\\\n",
    "& = m \\gamma ^ 2 \\delta ^ 2 + 2 C_m^{2} \\rho \\gamma^2 \\delta^2 & \\text{说明：} cov(f_i,f_j)=\\rho \\sqrt{Var(f_i)} \\sqrt{Var(f_j)}=\\rho \\delta^2  （1）\\\\\n",
    "& = \\delta^ 2 \\rho + \\frac{(1-\\rho)\\delta^2}{m} & \\text{说明：在Bagging中}\\gamma=\\frac{1}{m}\n",
    "\\end{aligned}\n",
    "$$\n",
    "\n",
    "运算规则：\n",
    "$$\n",
    "Var(cX) = c^2 Var(X) \\\\\n",
    "Var(X_1 + X_2 + X_3 + \\cdots + X_n) = Var(X_1) + Var(X_2) + Var(X_3) + \\cdots + Var(X_n)\n",
    "$$\n",
    "\n",
    "结论：\n",
    "* 整体模型的期望近似于基模型的期望，这也就意味着整体模型的偏差和基模型的偏差近似\n",
    "* 整体模型的方差小于等于基模型的方差（当相关性为1时取等号），随着基模型数（m）的增多，整体模型的方差减少，从而防止过拟合的能力增强，模型的准确度得到提高\n",
    "* bagging的防止过拟合的极限在1/m项趋近于0，所以并不是可以无穷的降低方差达到提高模型准确性的效果的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Boosting`：\n",
    "      AdaBoosting方式每次使用的是全部的样本，每轮训练改变样本的权重。下一轮训练的目标是找到一个函数f 来拟合上一轮的残差。当残差足够小或者达到设置的最大迭代次数则停止。Boosting会减小在上一轮训练正确的样本的权重，增大错误样本的权重。（对的残差小，错的残差大）\n",
    "      梯度提升的Boosting方式是使用代价函数对上一轮训练出的模型函数f的偏导来拟合残差。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Boosting`的推导：\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当`Boosting`中，$\\rho=1$，因此上面（1）可以简化为$Var(F)= m ^ 2 * \\delta ^ 2 * \\gamma ^ 2$\n",
    "所以`Boosting`与偏差有关。\n",
    "\n",
    "结论：\n",
    "* 整体模型的期望近似于基模型的期望之和，模型越多期望越容易拟合真实值\n",
    "* 整体模型的方差等于基模型的数量平方成正比，越多模型不稳定性越高，越容易过拟合。\n",
    "* Gradient Boosting Decision Tree为典型例子"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.4. 遇到过的深度学习中的偏差与方差问题？\n",
    "神经网络的拟合能力非常强，因此它的训练误差（偏差）通常较小；\n",
    "但是过强的拟合能力会导致较大的方差，使模型的测试误差（泛化误差）增大；\n",
    "因此深度学习的核心工作之一就是研究如何降低模型的泛化误差，这类方法统称为正则化方法。\n",
    "- dropout\n",
    "- dense中的normalization\n",
    "- 数据的shuffle\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.5 方差、偏差与模型的复杂度之间的关系？\n",
    "![](https://tva1.sinaimg.cn/large/006y8mN6gy1g8ly6pdyouj30dn07eq38.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 频率概率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.1 极大似然估计 - MLE\n",
    "原理：利用已知的样本结果，反推最有可能（最大概率）导致这样结果的参数值。\n",
    "\n",
    "似然函数可以表示为：$L(\\theta)=L(X_i;\\theta)= \\prod {P(X_i/\\theta)}$。目的使求的使似然函数能够达到最大情况下的θ即为未知参数θ最大似然估计值\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.2 最大后验估计 - MAP\n",
    "MAP的基础是贝叶斯公式：$P(\\theta/X) = P(\\theta,X)/P(X) 或者 P(B/A) = \\frac{P(A/B)P(B))}{P(A)}$。目的是通过观测值使得后验概率P(θ,X)最大即可\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.3 极大似然估计与最大后验概率的区别？\n",
    "- 最大似然估计中的采样满足所有采样都是独立同分布的假设\n",
    "- 最大后验概率在考虑了p(X/θ)的同时，还考虑了p(θ)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### 2.4 到底什么是似然，什么是概率估计？\n",
    "- 似然：给定了x求θ真实的可能性\n",
    "- 概率估计：给定了θ，X=x的可能性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 生成模型与判别模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一般不是研究员的工作，这边都是一个引入，考的不是生成判别模型的了解的有多彻底，而是想要带出其他具体模型的一些问题。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### 3.1 什么叫生成模型？\n",
    "求自变量和因变量的联合概率分布，P(x,y);再通过贝叶斯公式：P(y/x) = p(x,y)/p(x)。\n",
    "说白了就是玩的一手x在不同类别下出现的概率+不同类别的概率+x出现的概率进行复合计算，复合的时候考虑独立性的问题。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2 什么叫判别模型？\n",
    "求一个通过自变量能够表示出因变量的公式y=F(x)或者p(y/x)，核心是对于x找到一个最合适的公式得到y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 生成模型学习联合概率分布$p(x,y)$，而判别模型学习条件概率分布$p(y|x)$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### 3.3 什么时候会选择生成/判别模型？\n",
    "明确一点：绝大多数情况下，判别模型都要比生成模型效果好，而且需要的数据量和前提假设都要小于生成模型，上面的概念中可得原因。\n",
    "所以这个问题更想问的是什么时候要去用生成模型：\n",
    "- 但是如果存在异常点检测的需求，或者样本中有部分异常点的情况下，判别模型会结合所有数据进行拟合；而生成模型则是通过分布拟合的方式减少该部分的影响\n",
    "- 如果明明知道隐变量在此次分类的过程中起到非常巨大作用的情况下，判别模型对隐变量的学习往往通过人为构造，更加不确定性\n",
    "    - 一般会追问，如何构造？\n",
    "        - FM/FFM\n",
    "        - Neural Network\n",
    "            - 线性Dense\n",
    "            - 非线性激活\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.4 CRF/朴素贝叶斯/EM/最大熵模型/马尔科夫随机场/混合高斯模型各自是什么模型？\n",
    "因为这几个模型中都有概率计算的过程，不像knn，svm等都是距离计算一看就知道是判别模型。\n",
    "- 生成式模型：朴素贝叶斯，混合高斯模型，马尔科夫随机场，EM\n",
    "    - 仔细看过这些模型细节的朋友都应该知道，他们最后都是判断x属于拟合一个正负样本分布，然后对比属于正负样本的概率\n",
    "- 判别式模型：最大熵模型，CRF\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### 3.5 我的理解：\n",
    "- 无论是生成还是判别模型都是来求有监督模型的，目的就是求分类函数y=F(x)或者条件概率分布P(y/x)，通过分类函数或者条件概率函数进行数据分类\n",
    "- 算出属于正负样本的概率在相互对比的就是生成模型，直接得到结果概率的就是判别模型\n",
    "    - 生成模型得分布，判别模型得最优划分\n",
    "- 生成模型可以得到判别模型，反之不成立\n",
    "- 生成模型是求联合概率分布，判别模型是求条件概率分布，这句话不错，但是如果只回答到这，我认为是背答案式回答，其实生成模型的也是求的条件概率是通过的是联合概率得到的，而判别模型是之间得到，用来做分类的话，大概率都是条件概率作为最终结果；补充一下，二分情况下，如果单纯只用联合概率也可以判断"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. 先验概率和后验概率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本专题一般不会直接问，会在概率题中抽查，如果对概率论与数理统计题特别熟悉对同学也可以不用关注\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4.1 写出全概率公式&贝叶斯公式\n",
    "全概率公式：设事件$B_1,B_2,\\cdots,B_n$构成一个完备事件组，即它们两两不相容，和为全集且$P(B_i)>0$ ，则对任一事件A有：\n",
    "$$\n",
    "P(A) = \\sum_{i=1}^{n}P(B_i)P(A|B_i)\n",
    "$$\n",
    "\n",
    "贝叶斯公式：\n",
    "$$\n",
    "P(B_i|A) = \\frac{P(B_i)P(A|B_i)}{P(A)}=\\frac{P(B_i)P(A|B_i)}{\\sum_{i=1}^{n}P(B_i)P(A|B_i)}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### 4.2 说说你怎么理解为什么有全概率公式&贝叶斯公式\n",
    "全概率公式为全概率就是表示达到某个目的，有多种方式，算到达目的的概率。**key：算概率**\n",
    "\n",
    "贝叶斯公式为当给定条件发生变化后，会导致事件发生的可能性发生何种变化。**key：概率变化**\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### 4.3 什么是先验概率\n",
    "先验概率（prior probability）：指**根据以往经验和分析。在实验或采样前就可以得到的概率**。key:简单的暴力统计\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### 4.4 什么是后验概率\n",
    "后验概率（posterior probability）：指**某件事已经发生，想要计算这件事发生的原因是由某个因素引起的概率**。key：条件概率\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "#### 4.5 经典概率题\n",
    "\n",
    "有一个木桶，里面有M个白球，小明每分钟从桶中随机取出一个球涂成红色（无论白或红都涂红）再放回，问小明将桶中球全部涂红的期望时间是多少？\n",
    "\n",
    "P[i]代表M个球中已经有i个球是红色后，还需要的时间期望，去将所有球都变成红色。\n",
    "P[i]= (i/M) * P[i] + (1-i/M)* P[i+1] + 1\n",
    "解释一下，每一次抽取，(i/M)概率不变，(1-i/M)进入下一轮，额外加一次本次操作"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
